package util

import (
	"bytes"
	"fmt"
)

// PKCS#7 填充
//
// @param ciphertext []byte 原始内容
//
// @param blockSize int 数据块分割大小
func PKCS7Padding(ciphertext []byte, blockSize int) ([]byte, error) {
	if blockSize <= 0 || blockSize > 255 {
		return nil, fmt.Errorf("pkcs7 can padding only (1 ~ 255] bytes. error size: %d", blockSize)
	}
	// ciphertext 长度是 blockSize 整数倍，则填充 blockSize 个数据
	// ciphertext 长度不是 blockSize 整数倍，则填充差额 已确保是整数倍
	padding := blockSize - len(ciphertext)%blockSize
	// 根据 padding 大小创建 padding 长度，内容为 padding的 []byte
	padtext := bytes.Repeat([]byte{byte(padding)}, padding)
	return append(ciphertext, padtext...), nil
}

// PKCS#7 去除填充
func PKCS7UnPadding(plantText []byte) ([]byte, error) {
	length := len(plantText)
	// 获取 最后一个字符内容，最后一个字符即填充的个数
	unpadding := int(plantText[length-1])

	if unpadding > length {
		return nil, fmt.Errorf("unpadding length error: %d", unpadding)
	}
	return plantText[:(length - unpadding)], nil
}
